﻿using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class EventManager
{
    public enum EventType
    {
        ET_Null = 0,  // 无法发送
        ET_Test = 1,  // 测试消息

        ET_AttrRoleChanged = 100,       // 人物属性发生变化
        ET_AttrFightInit,
        ET_AttrFightChanged,            // 战斗属性发生变化
        ET_AttrRoleBaseAttrChanged,     // 主角基本属性
        ET_SelectedRole,                // 选中目标
        ET_SkillHit,                    // 技能击中
        ET_BuffChanged,                 // Buff改变	

        ET_OnResUpdated,                // 资源更新完毕
        ET_OnSceneLoaded = 150,         //场景加载完毕
        ET_OnPlayerEnterScene = 151,    // 玩家进入场景
        ET_OnCloseNpcDialog = 152,         // 结束NPC对话
        ET_OnAttackModeChange = 153,         // 改变攻击模式
        ET_OnGetChatMsg = 154,              //收到聊天消息
        ET_OnPlayerUnlock = 155,

        ET_ItemAdded = 200,
        ET_ItemRemoved = 201,
        ET_ItemCd = 202,                // 道具CD时间到了
        ET_ItemStartCd = 203,           // 道具开始时间
        ET_NewItemAdd = 204,            // 新道具添加
        ET_ItemUpdate = 205,
        ET_ItemAllDelete = 206,            //删除全部道具

        ET_WarehouseOpen = 250,         // 仓库打开
        ET_WarehouseClose = 251,        // 仓库关闭

        ET_TAO = 350,                   //道行值更新
        ET_Realm = 351,                 //境界UI更新
        ET_RealmChange = 352,           //境界提升
        ET_StarChange = 353,            //星位开启
        ET_SpellLvUp = 354,				// 技能升级
        ET_SpellLearn = 355,			// 技能学习
        ET_SpellEquipItem = 356,		// 装备技能书
        ET_EquipForgeOperation = 357,
        ET_PrestigeChange = 358,

        ET_QuestChanged = 400,          // 任务信息变化
        ET_QuestDone,                   // 任务信息变化
        ET_QuestChapterChanged,         // 任务章节信息变化
        ET_QuestListChanged,            // 进行中的任务信息变化
        ET_RolePromptSkill,		        // 提示角色技能
        ET_QuestAccept,					// 接受任务

        ET_Login = 450,                 //人物登录
        ET_ServerUIChange,              //连接服务器界面
        ET_DelRole,                    //删除角色
        ET_Input,                      //触碰
        ET_Team,                       //队伍
        ET_Report,                     //捷报
        ET_Margic,                     //法宝
        ET_Error,
        ET_NearbyPlayer,              //附近的人
        ET_FightChange,                //战斗力改变
        ET_AihChange,                   //心意值改变
        ET_SchoolInvite,               //门派邀请
        ET_OnQueneRoom,                 //更新房间排队信息
        ET_OnReadyRoom,                 //更新房间准备信息
        ET_OnQuitRoom,                  //退出排队房间
        ET_NewRedMsg,                   //提示玩家有新东西,图标上显示小红点
        ET_SetMount,                   //提示玩家有新东西,图标上显示小红点
        ET_UIOpen,						//打开UI
        ET_FirstEnterGame,				//创建角色后进入游戏（第一次进入游戏）
        ET_ShowRedMsg,
        ET_BuyChargeSuccess,
        ET_GetFirstChargeSuccess,
        ET_OpenCharge,
    }


    private static EventManager m_Instance;
    public static EventManager Instance
    {
        get
        {
            if (m_Instance == null)
                m_Instance = new EventManager();

            return m_Instance;
        }
    }

    public delegate void EventHandler(params object[] args);

    private Dictionary<EventType, Dictionary<EventHandler, object[]>> _Events = new Dictionary<EventType, Dictionary<EventHandler, object[]>>();

    // 发送事件
    public void notify(EventType id, params object[] args)
    {
        if (!_Events.ContainsKey(id))
            return;

        foreach (KeyValuePair<EventHandler, object[]> handlerInfo in _Events[id])
        {
            object[] tempArgs = new object[handlerInfo.Value.Length + args.Length];
            handlerInfo.Value.CopyTo(tempArgs, 0);
            args.CopyTo(tempArgs, handlerInfo.Value.Length);

            handlerInfo.Key(tempArgs);
        }
    }

    // 注册事件
    public bool register(EventType id, EventHandler handler, params object[] args)
    {
        if (id <= EventType.ET_Null || handler == null)
            return false;

        Dictionary<EventHandler, object[]> handlerInfo = null;
        if (_Events.ContainsKey(id))
        {
            handlerInfo = _Events[id];
        }
        else
        {
            handlerInfo = new Dictionary<EventHandler, object[]>();
            _Events.Add(id, handlerInfo);
        }

        if (handlerInfo.ContainsKey(handler))
        {
            //Global.LogError("Register event:[" + id.ToString() + "] repeated!");
            return false;
        }

        handlerInfo.Add(handler, args);

        return true;
    }

    // 注销事件
    public bool unregister(EventType id, EventHandler handler)
    {
        if (!_Events.ContainsKey(id))
            return false;

        Dictionary<EventHandler, object[]> handlerInfo = _Events[id];
        if (!handlerInfo.ContainsKey(handler))
            return false;

        handlerInfo.Remove(handler);

        if (handlerInfo.Count == 0)
            _Events.Remove(id);

        return true;
    }

    public bool unregister(EventType id)
    {
        if (!_Events.ContainsKey(id))
            return false;

        Dictionary<EventHandler, object[]> handlerInfo = _Events[id];
        handlerInfo.Clear();
        _Events.Remove(id);
        return true;
    }
}

